From 8525afc4081e88ba4e58c7a9f90f8721d2478590 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Mon, 18 Sep 2017 00:12:12 -0400 Subject: [PATCH] css: Implement font-variant-caps This gets translated to the corresponding OpenType features. --- gtk/gtkcssstyle.c | 33 +++++++++++++++++++++++++++++++++ gtk/gtkcssstylepropertyimpl.c | 24 ++++++++++++++++++++++++ gtk/gtkcsstypesprivate.h | 1 + 3 files changed, 58 insertions(+) diff --git a/gtk/gtkcssstyle.c b/gtk/gtkcssstyle.c index a0bdc8d536..8b35f0e5ce 100644 --- a/gtk/gtkcssstyle.c +++ b/gtk/gtkcssstyle.c @@ -228,6 +228,7 @@ gtk_css_style_get_pango_attributes (GtkCssStyle *style) GtkCssValue *kerning; GtkCssValue *ligatures; GtkCssValue *position; + GtkCssValue *caps; GString *s; int i; @@ -312,6 +313,38 @@ gtk_css_style_get_pango_attributes (GtkCssStyle *style) g_string_append (s, "sups 1"); } + caps = gtk_css_style_get_value (style, GTK_CSS_PROPERTY_FONT_VARIANT_CAPS); + if (strcmp (_gtk_css_ident_value_get (caps), "small-caps") == 0) + { + if (s->len > 0) g_string_append (s, ", "); + g_string_append (s, "smcp 1"); + } + else if (strcmp (_gtk_css_ident_value_get (caps), "all-small-caps") == 0) + { + if (s->len > 0) g_string_append (s, ", "); + g_string_append (s, "c2sc 1, smcp 1"); + } + else if (strcmp (_gtk_css_ident_value_get (caps), "petite-caps") == 0) + { + if (s->len > 0) g_string_append (s, ", "); + g_string_append (s, "pcap 1"); + } + else if (strcmp (_gtk_css_ident_value_get (caps), "all-petite-caps") == 0) + { + if (s->len > 0) g_string_append (s, ", "); + g_string_append (s, "c2pc 1, pcap 1"); + } + else if (strcmp (_gtk_css_ident_value_get (caps), "unicase") == 0) + { + if (s->len > 0) g_string_append (s, ", "); + g_string_append (s, "unic 1"); + } + else if (strcmp (_gtk_css_ident_value_get (caps), "titling-caps") == 0) + { + if (s->len > 0) g_string_append (s, ", "); + g_string_append (s, "titl 1"); + } + attrs = add_pango_attr (attrs, pango_attr_font_features_new (s->str)); g_string_free (s, TRUE); diff --git a/gtk/gtkcssstylepropertyimpl.c b/gtk/gtkcssstylepropertyimpl.c index 3514dc28f7..12b4f3ce15 100644 --- a/gtk/gtkcssstylepropertyimpl.c +++ b/gtk/gtkcssstylepropertyimpl.c @@ -641,6 +641,22 @@ parse_font_variant_position (GtkCssStyleProperty *property, return value; } +static GtkCssValue * +parse_font_variant_caps (GtkCssStyleProperty *property, + GtkCssParser *parser) +{ + GtkCssValue *value = NULL; + + value = _gtk_css_ident_value_try (parser, "normal", + "small-caps", "all-small-caps", + "petite-caps", "all-petite-caps", + "unicase", "titling-caps", NULL); + if (value == NULL) + _gtk_css_parser_error (parser, "unknown value for property"); + + return value; +} + static GtkCssValue * box_shadow_value_parse (GtkCssStyleProperty *property, GtkCssParser *parser) @@ -1150,6 +1166,14 @@ _gtk_css_style_property_init_properties (void) parse_font_variant_position, NULL, _gtk_css_ident_value_new ("normal")); + gtk_css_style_property_register ("font-variant-caps", + GTK_CSS_PROPERTY_FONT_VARIANT_CAPS, + G_TYPE_NONE, + 0, + GTK_CSS_AFFECTS_TEXT | GTK_CSS_AFFECTS_TEXT_ATTRS, + parse_font_variant_caps, + NULL, + _gtk_css_ident_value_new ("normal")); gtk_css_style_property_register ("text-shadow", GTK_CSS_PROPERTY_TEXT_SHADOW, G_TYPE_NONE, diff --git a/gtk/gtkcsstypesprivate.h b/gtk/gtkcsstypesprivate.h index cb340ea05e..3adb14ca00 100644 --- a/gtk/gtkcsstypesprivate.h +++ b/gtk/gtkcsstypesprivate.h @@ -166,6 +166,7 @@ enum { /*< skip >*/ GTK_CSS_PROPERTY_FONT_KERNING, GTK_CSS_PROPERTY_FONT_VARIANT_LIGATURES, GTK_CSS_PROPERTY_FONT_VARIANT_POSITION, + GTK_CSS_PROPERTY_FONT_VARIANT_CAPS, GTK_CSS_PROPERTY_TEXT_SHADOW, GTK_CSS_PROPERTY_BOX_SHADOW, GTK_CSS_PROPERTY_MARGIN_TOP, -- 2.30.2